package domain

import (
	"github.com/hlhutu/gormplus"
	"log"
	"ruoyi-go/internal/framework/db"
	"time"
)

// SysRole 角色表 sys_role
type SysRole struct {
	// 角色ID
	RoleId int `json:"roleId" gorm:"column:role_id" form:"roleId"`
	// 角色名称
	RoleName string `json:"roleName" gorm:"column:role_name" form:"roleName"`
	// 角色权限
	RoleKey string `json:"roleKey" gorm:"column:role_key" form:"roleKey"`
	// 角色排序
	RoleSort int `json:"roleSort" gorm:"column:role_sort" form:"roleSort"`
	// 数据范围（1：所有数据权限；2：自定义数据权限；3：本部门数据权限；4：本部门及以下数据权限；5：仅本人数据权限）
	DataScope string `json:"dataScope" gorm:"column:data_scope" form:"dataScope"`
	// 菜单树选择项是否关联显示（ 0：父子不互相关联显示 1：父子互相关联显示）
	MenuCheckStrictly bool `json:"menuCheckStrictly" gorm:"column:menu_check_strictly" form:"menuCheckStrictly"`
	// 部门树选择项是否关联显示（0：父子不互相关联显示 1：父子互相关联显示）
	DeptCheckStrictly bool `json:"deptCheckStrictly" gorm:"column:dept_check_strictly" form:"deptCheckStrictly"`
	// 角色状态（0正常 1停用）
	Status string `json:"status" gorm:"column:status" form:"status"`
	// 删除标志（0代表存在 2代表删除）
	DelFlag string `json:"delFlag" gorm:"column:del_flag" form:"delFlag"`
	// 用户是否存在此角色标识 默认不存在
	Flag bool `json:"flag" gorm:"column:flag" form:"flag"`
	// 创建者
	CreateBy string `json:"createBy" gorm:"column:create_by" form:"createBy"`
	// 创建时间
	CreateTime time.Time `json:"createTime" gorm:"column:create_time" form:"createTime"`
	// 更新者
	UpdateBy string `json:"updateBy" gorm:"column:update_by" form:"updateBy"`
	// 更新时间
	UpdateTime time.Time `json:"updateTime" gorm:"column:update_time" form:"updateTime"`
	// 备注
	Remark string `json:"remark" gorm:"column:remark" form:"remark"`

	/**
	冗余字段
	*/

	// 菜单组
	MenuIds []int64 `json:"menuIds" gorm:"-" form:"menuIds"`
	// 部门组（数据权限）
	DeptIds []int64 `json:"deptIds" gorm:"-" form:"deptIds"`
	// 角色菜单权限
	Permissions []string `json:"permissions" gorm:"-" form:"permissions"`
}

func (m SysRole) IsAdmin() bool {
	return IsAdminRole(m.RoleId)
}

func IsAdminRole(roleId int) bool {
	return roleId == 1 // id为1才是超管
}

func (m SysRole) TableName() string {
	return "sys_role"
}

type sysRoleModel struct {
	gormplus.Model[SysRole]
}

var sysRoleModelInst *sysRoleModel

func SysRoleModel() *sysRoleModel {
	if sysRoleModelInst == nil {
		sysRoleModelInst = &sysRoleModel{Model: gormplus.NewModel(SysRole{}, db.GormDB)}
	}
	return sysRoleModelInst
}

// SelectRolePermissionByUserId 根据userId查询所有权限
func (s *sysRoleModel) SelectRolePermissionByUserId(userId int) []*SysRole {
	var results []*SysRole
	err := db.GormDB.Table("sys_role r").
		Select("r.*").
		Joins("left join sys_user_role ur on ur.role_id = r.role_id").
		Where("r.del_flag = '0' and ur.user_id = ?", userId).
		Scan(&results).Error
	if err != nil {
		log.Println(err)
	}
	return results
}

func (s *sysRoleModel) SelectRoleNamesByUsername(username string) []*SysRole {
	var roles []*SysRole
	err := db.GormDB.Distinct("r.role_id", "r.role_name", "r.role_key", "r.role_sort", "r.data_scope",
		"r.menu_check_strictly", "r.dept_check_strictly", "r.status", "r.del_flag",
		"r.create_time", "r.remark").
		Table("sys_role r").
		Joins("left join sys_user_role ur on ur.role_id = r.role_id").
		Joins("left join sys_user u on u.user_id = ur.user_id").
		Joins("left join sys_dept d on u.dept_id = d.dept_id").
		Where("r.del_flag = ? AND u.user_name = ?", "0", username).
		Find(&roles).Error
	if err != nil {
		log.Println(err)
	}
	return roles
}
